CloudShell VPC environment を SCP で制限してみる

CloudShell VPC environment を SCP で制限してみる

VPC 上に気軽にコンピューティング環境を作成できないようにしたい

Clock Icon2024.07.04

こんにちは、AWS 事業本部の平木です!

みなさんは、CloudShell で最近アップデートのあった CloudShell を VPC 環境に作成できる機能を活用していますか?

初めて知った方はこちらのブログをご参照ください。

https://dev.classmethod.jp/articles/cloudshell-vpc-environment/

CloudShell を VPC 環境に作成できるようになったことで AWS 運用、特に踏み台サーバの運用方法がかなり変わってくるといった側面を持つ反面、場合によっては気軽に作成されては困るユーザーもいるかと思います。

今回はいくつか CloudShell VPC environment を SCP(サービスコントロールポリシー)で制限するパターンをご紹介します。

CloudShell VPC environment を一切作成させたくない

まずはそもそも作成させたくないパターンです。

この場合は下記ポリシーで実現可能です。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyCloudShellVpcEnvironments",
      "Action": [
        "cloudshell:CreateEnvironment"
      ],
      "Effect": "Deny",
      "Resource": "*",
      "Condition": {
        "Null": {
          "cloudshell:VpcIds": "false"
        }
      }
    }
  ]
}

Condition 要素で条件演算子Nullを活用することで特定の条件キーがあるかどうかを判別できます。

条件演算子 Null については下記ブログをご参照ください。

https://dev.classmethod.jp/articles/aws-iam-condition-null-tukaimichi/

VpcIdsが存在したら環境を作成させないようにしたいためfalseとなっています。

falseからtrueに変更いただくと逆にパブリック CloudShell を使用不可にし、CLoudShell VPC environment のみ使用可能にできます。

起動できる VPC を制限する

次は作成は許容するけど特定の VPC 以外には作成させないパターンです。

下記ポリシーで実現できます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "EnforceOutOfVpc",
      "Action": [
        "cloudshell:CreateEnvironment"
      ],
      "Effect": "Deny",
      "Resource": "*",
      "Condition": {
        "ForAnyValue:StringNotEquals": {
          "cloudshell:VpcIds": "vpc-ID"
        }
      }
    }
  ]
}

vpc-IDを任意の VPC ID に置換いただくと指定した VPC ID 以外では起動できないようになります。

パブリック CloudShell については制限していないため使用できます。

起動できるサブネットを制限する

次は起動できるサブネットを制限するパターンです。

パブリックサブネットには起動させずプライベートサブネットのみに起動させたいといったシチュエーションなどを想定しています。

下記ポリシーで実現できます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "EnforceStayInSpecificSubnets",
      "Action": [
        "cloudshell:CreateEnvironment"
      ],
      "Effect": "Deny",
      "Resource": "*",
      "Condition": {
        "ForAllValues:StringNotEquals": {
          "cloudshell:SubnetIds": [
            "subnet-id1",
            "subnet-id2"
          ]
        }
      }
    }
  ]
}

subnet-id1subnet-id2を置換いただくことで起動したいサブネットを制限できます。

付与できるセキュリティグループを制限する

続いては作成は許容するけど特定のセキュリティグループを関連付けないと許容しないパターンです。

セキュリティグループを自由に付与できてしまうと RDS への接続などが容易になってしまう恐れがあるためこちらを使用したいケースはあるかと思います。

下記ポリシーで実現できます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "EnforceOutOfSecurityGroups",
      "Action": [
        "cloudshell:CreateEnvironment"
      ],
      "Effect": "Deny",
      "Resource": "*",
      "Condition": {
        "ForAnyValue:StringNotEquals": {
          "cloudshell:SecurityGroupIds": "sg-ID"
        }
      }
    }
  ]
}

sg-IDを任意のセキュリティグループ ID に置換していただくことで指定したセキュリティグループを設定しないと起動不可にできます。

起動できるユーザー(IAM ロールや IAM ユーザーなど)を制限する

最後は CloudShell VPC environment を起動できるユーザーを制限するパターンです。

アカウントレベルで特定のロールなどを保持したユーザーに制限できます。

下記ポリシーで実現できます。


{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "EnforceOutOfUser",
      "Action": [
        "cloudshell:CreateEnvironment"
      ],
      "Effect": "Deny",
      "Resource": "*",
      "Condition": {
        "Null": {
          "cloudshell:VpcIds": "false"
        },
        "ArnNotEquals": {
          "aws:PrincipalArn": "USER_ARN"
        }
      }
    }
  ]
}

USER_ARNに任意の ARN を置換することで特定のロールやユーザーの場合にのみ利用可能なように制限できます。

IAM Identity Center を使用している場合は以下のように記載することでマルチアカウントにおいても柔軟に対応できます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "EnforceOutOfIICUser",
      "Action": [
        "cloudshell:CreateEnvironment"
      ],
      "Effect": "Deny",
      "Resource": "*",
      "Condition": {
        "Null": {
          "cloudshell:VpcIds": "false"
        },
        "ArnNotLike": {
          "aws:PrincipalArn": "arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/*/AWSReservedSSO_(許可セット名)_*"
        }
      }
    }
  ]
}

パブリック CloudShell は継続して利用可能です。

参考

おわりに

今回は、CloudShell VPC environment を SCP でいろいろ制限してみました。

IP 制限をかける方法も検証してみましたが現時点では見つけられなかったため起動できるユーザーなどで制限をかけるなどを検討いただければと思います。

この記事がどなたかの役に立つと嬉しいです。

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.